package com.scuec.tourismwebsite.controller;

import com.scuec.tourismwebsite.entity.BoutiqueTour;
import com.scuec.tourismwebsite.service.BoutiqueTourService;
import com.scuec.tourismwebsite.util.FileUtil;
import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.Valid;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Optional;

@CrossOrigin(origins = "http://localhost:5173")
@RestController
@RequestMapping("/tour/v1/boutiqueTours")
public class BoutiqueTourController {

    @Autowired
    private BoutiqueTourService boutiqueTourService;

    @GetMapping("query")
    public List<BoutiqueTour> findall() {
        return boutiqueTourService.findAll();
    }

    @GetMapping
    public ResponseEntity<Page<BoutiqueTour>> getAllBoutiqueTours(Pageable pageable) {
        Page<BoutiqueTour> page = boutiqueTourService.findAll(pageable);
        return ResponseEntity.ok(page);
    }

    @GetMapping("/all")
    public ResponseEntity<List<BoutiqueTour>> getAllBoutiqueToursNoPagination() {
        List<BoutiqueTour> allBoutiqueTours = boutiqueTourService.findAll(); // 查询所有精品团
        return ResponseEntity.ok(allBoutiqueTours);
    }

    @GetMapping("/{boutique_id}")
    public ResponseEntity<?> getBoutiqueTourById(@PathVariable Integer boutique_id) {
        Optional<BoutiqueTour> tourOptional = boutiqueTourService.findById(boutique_id);
        return tourOptional.map(ResponseEntity::ok)
                .orElseGet(() -> ResponseEntity.notFound().build());
    }

    @PostMapping
    public ResponseEntity<BoutiqueTour> addBoutiqueTour(
            @RequestPart("boutiqueTour") BoutiqueTour boutiqueTour,
            @RequestPart(value = "image", required = false) MultipartFile image) {

        BoutiqueTour addedTour = boutiqueTourService.add(boutiqueTour);

        if (image != null && !image.isEmpty() && addedTour.getBoutique_id() != null) {
            String imageUrl = uploadTourImage(image, addedTour.getBoutique_id());
            addedTour.setImage_url(imageUrl);
            boutiqueTourService.updatePhoto(addedTour.getBoutique_id(), imageUrl);
        }

        // 确保返回的 BoutiqueTour 对象包含 boutique_id
        return ResponseEntity.ok(addedTour);
    }





    @PutMapping("/{boutique_id}")
    public ResponseEntity<BoutiqueTour> updateBoutiqueTour(
            @PathVariable Integer boutique_id,
            @RequestPart("boutiqueTour") BoutiqueTour boutiqueTour,  // 需要指定 @RequestPart 来接收 multipart 数据
            @RequestPart(value = "image", required = false) MultipartFile image) {  // 处理上传的图片文件

        // 假设上传图片
        if (image != null && !image.isEmpty()) {
            String imageUrl = uploadTourImage(image, boutique_id);  // 假设上传图片并获取图片 URL
            boutiqueTour.setImage_url(imageUrl);

            // 调用 updatePhoto 来更新数据库中的 image_url
            boolean photoUpdated = boutiqueTourService.updatePhoto(boutique_id, imageUrl);
            if (!photoUpdated) {
                return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);  // 如果图片更新失败，返回 500 错误
            }
        }

        // 更新其他信息
        BoutiqueTour updatedTour = boutiqueTourService.update(boutique_id, boutiqueTour);
        return ResponseEntity.ok(updatedTour);
    }



    @DeleteMapping("/{boutique_id}")
    public ResponseEntity<Void> deleteBoutiqueTour(@PathVariable Integer boutique_id) {
        boutiqueTourService.delete(boutique_id);
        return ResponseEntity.ok().build();
    }

    @GetMapping("/search")
    public ResponseEntity<Page<BoutiqueTour>> searchBoutiqueTours(@RequestParam String tourName, Pageable pageable) {
        Page<BoutiqueTour> page = boutiqueTourService.searchByTourName(tourName, pageable);
        return ResponseEntity.ok(page);
    }


    @PostMapping("upload")  // 图片上传
    public String uploadTourImage(@RequestParam("file") MultipartFile file,
                                  @RequestParam(value = "id", required = false) Integer boutiqueId) {
        // 获取上传文件的原始文件名
        String oldFileName = file.getOriginalFilename();
        System.out.println("Uploading file: " + oldFileName);

        // 获取文件的扩展名
        String typeName = oldFileName.substring(oldFileName.lastIndexOf("."));

        // 获取文件上传的存储路径
        String filePath = FileUtil.getUploadFilePath() + "/attractions";
        File dir = new File(filePath);

        // 如果文件夹不存在，则创建
        if (!dir.exists()) {
            dir.mkdirs();
        }

        // 生成新的文件名（使用当前时间戳来避免文件名冲突）
        String newFileName = System.currentTimeMillis() + typeName;
        String photos = newFileName;
        System.out.println("New file name: " + newFileName);

        try {
            // 将上传的文件保存到指定路径
            FileUtil.uploadFile(file.getBytes(), filePath, newFileName);
        } catch (Exception e) {
            // 如果上传失败，抛出异常
            throw new RuntimeException("Failed to upload image", e);
        }

        // 如果有传入 boutiqueId，则为编辑操作，更新图片路径
        if (boutiqueId != null) {
            // 调用服务层更新数据库中的图片路径
            boutiqueTourService.updatePhoto(boutiqueId, photos);
        }

        // 返回上传后的文件名（用于前端显示）
        return photos;  // 返回新文件的名称或路径
    }

    @PutMapping("/decreaseAvailability/{boutique_id}")
    public int decreaseAvailability(@PathVariable Integer boutique_id) {
        return boutiqueTourService.decreaseAvailability(boutique_id);
    }

    @PutMapping("/detail/{boutique_id}")
    public ResponseEntity<BoutiqueTour> updateBoutiqueTourDetails(
            @PathVariable Integer boutique_id,
            @RequestBody BoutiqueTour boutiqueTour) {  // 使用 @RequestBody 来接收 JSON 数据

        // 更新精品团信息
        BoutiqueTour updatedTour = boutiqueTourService.update(boutique_id, boutiqueTour);
        if (updatedTour == null) {
            return ResponseEntity.notFound().build();  // 如果更新失败，返回 404 错误
        }
        return ResponseEntity.ok(updatedTour);  // 如果更新成功，返回更新后的 BoutiqueTour 对象
    }


}






